package thread.src.create;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 线程的创建方式3:实现callable接口,结合FutureTask完成
 */
public class ThreadDemo3 {
    public static void main(String[] args) throws Exception {
        //创建任务对象,call对象是专门负责执行线程内容的
        Callable<String> call = new MyCallable(10);
        //FutureTask是用来记录call的返回结果的,因为call自身无法预知自己结束运行的时刻
        //把callable任务对象交给futureTask对象,因为毕竟要通过匿名内部类或者实现类的方式产生Runnable的子类,干脆封装成futureTask类
        FutureTask<String> ft = new FutureTask<>(call);
        //再用线程对象Thread包装futureTask
        Thread t = new Thread(ft);
        t.start();

        //在创建一个线程,ft2还用来接返回值,不能直接包装
        FutureTask<String> ft2 = new FutureTask<>(new MyCallable(10));
        new Thread(ft2).start();

        //获取返回值,如果线程没有跑完,会等返回值继续往下跑
        System.out.println(ft.get());
        System.out.println(ft2.get());
    }
}
/**
 * 定义人物类,实现Callable接口
 */
class MyCallable implements Callable<String>{
    private int n;

    public MyCallable(int n) {
        this.n = n;
    }

    /**
     * 重写call方法(任务方法)
     * @return
     * @throws Exception
     */
    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += i;
        }
        return "子线程运行的结果是:" + sum;
    }
}